package com.haierp.service.impl;

import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.framework.service.impl.SuperServiceImpl;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.haierp.mapper.ItemSkuMapper;
import com.haierp.model.Inventory;
import com.haierp.model.ItemSku;
import com.haierp.service.IInventoryService;
import com.haierp.service.IItemSkuService;
import com.haierp.util.JsonPageResult;
import com.haierp.vo.ItemQueryVO;
import com.haierp.vo.ItemSkuQueryVO;

@Service("itemSkuService")
public class ItemSkuServiceImpl extends SuperServiceImpl<ItemSkuMapper, ItemSku>  implements IItemSkuService {
	
	@Autowired
	private IInventoryService inventoryService;

	@Override
	public JsonPageResult<List<ItemSku>> queryItemSkus(ItemSkuQueryVO itemSkuQueryVO) {
		JsonPageResult<List<ItemSku>> itemResult = new JsonPageResult<>();
		if("预出库".equals(itemSkuQueryVO.getItemName())) {
			//1、查询总的记录数量
			itemSkuQueryVO.setItemName(null);
			Integer totalCount =  this.baseMapper.queryidleItemSkusCount(itemSkuQueryVO);
			
			//2、查询分页记录
			if(totalCount!=null&&totalCount!=0L){
				itemResult.buildPage(totalCount, itemSkuQueryVO);
				List<ItemSku> itemSkus = this.baseMapper.queryidleItemSkus(itemSkuQueryVO);
				itemResult.setData(itemSkus);
			}
		} else {
			//1、查询总的记录数量
			itemSkuQueryVO.setSkuStatus(-1);
			Integer totalCount =  this.baseMapper.queryItemSkusCount(itemSkuQueryVO);
			
			//2、查询分页记录
			if(totalCount!=null&&totalCount!=0L){
				itemResult.buildPage(totalCount, itemSkuQueryVO);
				List<ItemSku> itemSkus = this.baseMapper.queryItemSkus(itemSkuQueryVO);
				itemResult.setData(itemSkus);
			}
		}
		
		return itemResult;
	}

	@Override
	public List<Inventory> initInventory(List<ItemSku> itemSkuList) {
		List<Inventory> inventoryList = null;
		if (CollectionUtils.isNotEmpty(itemSkuList)) {
			inventoryList = Lists.transform(itemSkuList, new Function<ItemSku, Inventory>() {
				@Override
				public Inventory apply(ItemSku itemSku) {
					// 初始化库存信息
					Inventory inventory = new Inventory();
					inventory.setGmtCreate(new Date());
					inventory.setGmtModify(new Date());
					inventory.setItemId(itemSku.getItemId());
					inventory.setItemName(itemSku.getItemName());
					inventory.setCompanyId(itemSku.getCompanyId()); //初始化库存系统也要加入companyId
					inventory.setInventory(0);
					inventory.setLockedInv(0);
					inventory.setTransInv(0);
					if (itemSku.getVirtualInv() > 0) {
						inventory.setVirtualInv(itemSku.getVirtualInv());
					} else {
						inventory.setVirtualInv(0);
					}
					inventory.setSkuId(itemSku.getId());
					inventory.setSkuCode(itemSku.getSkuCode());
					inventory.setUpc(itemSku.getUpc());
					return inventory;
				}
			});
		}
		return inventoryList;
	}

	@Override
	public void addItemSku(ItemSku itemSku) {
		this.baseMapper.insert(itemSku);
		Inventory inventory = inventoryService.queryInventoryBySkuId(itemSku.getItemId(), itemSku.getId());
		if(inventory==null){
			List<ItemSku> newInvList = Lists.newArrayList();
			newInvList.add(itemSku);
			List<Inventory>  inventoryList = initInventory(newInvList);
			inventoryService.insertBatch(inventoryList);
		}else{
			if(inventory.getVirtualInv()!=itemSku.getVirtualInv()){
				inventory.setVirtualInv(itemSku.getVirtualInv());
				inventory.setGmtModify(new Date());
				inventoryService.updateById(inventory);
			}
		}
	}


	@Override
	public void updateItemSku(ItemSku itemSku) {
		this.baseMapper.updateSelectiveById(itemSku);
		Inventory inventory = inventoryService.queryInventoryBySkuId(itemSku.getItemId(), itemSku.getId());
		if(inventory==null){
			List<ItemSku> newInvList = Lists.newArrayList();
			newInvList.add(itemSku);
			List<Inventory>  inventoryList = initInventory(newInvList);
			inventoryService.insertBatch(inventoryList);
		}else{
			if(inventory.getVirtualInv()!=itemSku.getVirtualInv()){
				inventory.setVirtualInv(itemSku.getVirtualInv());
				inventory.setGmtModify(new Date());
				inventoryService.updateById(inventory);
			}
		}
	}

	@Override
	public List<ItemSku> queryItemSkusByItemId(ItemQueryVO itemQueryVO) {
		if(itemQueryVO.getItemId()!=null){
			return this.baseMapper.queryItemSkusById(itemQueryVO); 
		}
		return null;
	}

	@Override
	public ItemSku queryItemSkusBySkuId(ItemQueryVO itemQueryVO) {
		if(itemQueryVO.getSkuId()!=null){
			List<ItemSku>  itemSkus = this.baseMapper.queryItemSkusById(itemQueryVO);
			if(CollectionUtils.isNotEmpty(itemSkus)){
				return itemSkus.get(0);
			}
			return null; 
		}
		return null;
	}
	
	@Override
	public void deleteSkuById(Long skuId) {
		if(isCanDeleteSku(skuId)) {
			this.baseMapper.deleteById(skuId);
			inventoryService.deleteInventoryBySkuId(skuId);
		}
	}
	
	@Override
	public boolean isCanDeleteSku(Long skuId) {
		if(skuId!=null) {
			Integer  o = this.baseMapper.queryItemSkusCountInOrder(skuId);
			if(o !=null && o>0) return false;
			
			Integer i = this.baseMapper.queryItemSkusCountInInventoryArea(skuId);
			if(i !=null && i>0) return false;
			
			Integer t = this.baseMapper.queryItemSkusCountInTask(skuId);
			if(t !=null && t>0) return false;
			
			Integer p = this.baseMapper.queryItemSkusCountInPurchase(skuId);
			if(p !=null && p>0) return false;
			
			return true;
		}
		return false;
	}
	
	@Override
	public Integer queryMaxSkuCodeIndex(Long itemId) {
		return this.baseMapper.queryMaxSkuCodeIndex(itemId);
	}
	
	@Override
	public List<ItemSku> queryItemSkusForExcel() {
		return this.baseMapper.queryItemSkusForExcel();
	}

	@Override
	public List<ItemSku> queryItemSkusForItemThirdSale(Long itemId) {
		return this.baseMapper.queryItemSkusForItemThirdSale(itemId);
	}

	@Override
	public void updateAllOldBuySite(ItemSkuQueryVO itemSkuQueryVO) {
		this.baseMapper.updateAllOldBuySite(itemSkuQueryVO);
	}
	
}
